home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / lib / yotpin / src / rake.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-20  |  4.8 KB  |  216 lines

  1. /*
  2. *    Yamana's Otomeza Plug-in Tool
  3. *        熊手
  4. *    
  5. *    1995.07.23    熊手ペンの余分な処理を削除した
  6. *    1995.07.30    75% ほど高速化, size=2^n のとき乱数に偏りが出るのを改善
  7. *    1995.08.06    マスク部分の動作を設定できるようにした
  8. *    
  9. */
  10. #include    "otome_pi.h"
  11.  
  12. const char longname[] = "EFFECT: 熊手";
  13. int            cnfg_max = 3;
  14. PI_CNFG        cnfg[] = {
  15.                 {"熊手の数"            , 1, 16,  4,  4 },
  16.                 {"熊手の大きさ"        , 2, 32,  8,  8 },
  17.                 {"マスク→散らない"    , 0,  1,  0,  0 },
  18.             };
  19.  
  20. #define    USE_ENV        PI_SET_ENV
  21. #define    USE_TYPE    PI_DRAW_BOXF
  22. #define    USE_PEN        PI_USER_PEN
  23. #include    "otome_pi.c"
  24.  
  25. /*******************************************************/
  26.  
  27. int Bit[] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
  28.  
  29. /* 描画可能のとき !0 を返す */
  30. #if 0
  31. int     getMaskBit( _x, _y)
  32. int     _x,_y;
  33. {
  34.     return (pi_imge->edit[((_x)>>3) + (_y)*(pi_imge->size.x>>3) ]
  35.                     & Bit[ (_x) & 7] );
  36. }
  37. #else
  38.  
  39. #define        getMaskBit( _x, _y )    \
  40.         (pi_imge->edit[((_x)>>3) + (_y)*(pi_imge->size.x>>3) ]    \
  41.                     & Bit[ (_x) & 7] )
  42.  
  43. #endif
  44.  
  45. void    chgFunc16( x1,y1,x2,y2 ,mode)
  46. int     x1,y1,x2,y2,mode;
  47. {
  48.     int col1 = (pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1) ]
  49.                     >>((x1 & 1)? 4:0))& 0x0f ;
  50.     int col2 = (pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1) ]
  51.                     >>((x2 & 1)? 4:0))& 0x0f ;
  52.     char    *p;
  53.     
  54.     if( mode == 0 )
  55.     {
  56.         if( getMaskBit(x2,y2) )
  57.         {    p = &( pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1)] );
  58.             
  59.             if( x2 & 1 )    *p = (*p & 0x0f) | ((col1<<4)& 0xf0);
  60.                     else    *p = (*p & 0xf0) | ((col1   )& 0x0f);
  61.         }
  62.         if( getMaskBit(x1,y1) )
  63.         {    p = &( pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1)] );
  64.         
  65.             if( x1 & 1 )    *p = (*p & 0x0f) | ((col2<<4)& 0xf0);
  66.                     else    *p = (*p & 0xf0) | ((col2   )& 0x0f);
  67.         }
  68.     }
  69.     else    /* 共にマスク外 */
  70.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  71.         {    p = &( pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1)] );
  72.             
  73.             if( x2 & 1 )    *p = (*p & 0x0f) | ((col1<<4)& 0xf0);
  74.                     else    *p = (*p & 0xf0) | ((col1   )& 0x0f);
  75.             
  76.             p = &( pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1)] );
  77.             
  78.             if( x1 & 1 )    *p = (*p & 0x0f) | ((col2<<4)& 0xf0);
  79.                     else    *p = (*p & 0xf0) | ((col2   )& 0x0f);
  80.         }
  81.     }
  82. }
  83.  
  84. void    chgFunc256( x1,y1,x2,y2 ,mode)
  85. int     x1,y1,x2,y2,mode;
  86. {
  87.     int     col1 = (pi_imge->image[ x1 + y1*(pi_imge->size.x) ])& 0xff ;
  88.     int     col2 = (pi_imge->image[ x2 + y2*(pi_imge->size.x) ])& 0xff ;
  89.     
  90.     if( mode==0 )
  91.     {    
  92.         if( getMaskBit(x2,y2) )
  93.             pi_imge->image[ x2 + y2*(pi_imge->size.x) ] = col1;
  94.         if( getMaskBit(x1,y1) )
  95.             pi_imge->image[ x1 + y1*(pi_imge->size.x) ] = col2;
  96.     }
  97.     else
  98.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  99.         {    pi_imge->image[ x2 + y2*(pi_imge->size.x) ] = col1;
  100.             pi_imge->image[ x1 + y1*(pi_imge->size.x) ] = col2;
  101.         }
  102.     }
  103. }
  104.  
  105. void    chgFunc32K( x1,y1,x2,y2 ,mode)
  106. int     x1,y1,x2,y2,mode;
  107. {
  108.     char    *p1 = &( pi_imge->image[(x1<<1) + y1*(pi_imge->size.x<<1)] );
  109.     char    *p2 = &( pi_imge->image[(x2<<1) + y2*(pi_imge->size.x<<1)] );
  110.     char    tmp[2];
  111.     
  112.     tmp[0] = *p2,    tmp[1] = *(p2+1);
  113.     
  114.     if( mode==0 )
  115.     {    if( getMaskBit(x2,y2) )
  116.             *p2 = *p1,        *(p2+1) = *(p1+1);
  117.         if( getMaskBit(x1,y1) )
  118.             *p1 = tmp[0],    *(p1+1) = tmp[1];
  119.     }else
  120.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  121.         {    *p2 = *p1,        *(p2+1) = *(p1+1);
  122.             *p1 = tmp[0],    *(p1+1) = tmp[1];
  123.         }
  124.     }
  125. }
  126. /**********************************************************************/
  127.  
  128. int APL_exec()
  129. {
  130.     int     i,j,k;
  131.     int     ch,mx,my;
  132.     int     val,size,mode;
  133.     
  134.     register int    x,y;
  135.     int     x1,y1,x2,y2,xs,ys,dx,dy;
  136.     void    (*chgFunc)();
  137.     FRAME    fr;
  138.     
  139. #ifdef DEBUG
  140.     clock_t    t;
  141.     t = clock();
  142. #endif
  143.     
  144.     val  = cnfg[0].val * 2;
  145.     size = cnfg[1].val;
  146.     mode = cnfg[2].val;
  147.     
  148.     fr.lupx = WORD( g_para + 0 );
  149.     fr.lupy = WORD( g_para + 2 );
  150.     fr.rdwx = WORD( g_para + 4 );
  151.     fr.rdwy = WORD( g_para + 6 );
  152.     
  153.     if( pi_imge->pix  < 8 )    chgFunc = chgFunc16;
  154.     if( pi_imge->pix == 8 )    chgFunc = chgFunc256;
  155.     if( pi_imge->pix  > 8 )    chgFunc = chgFunc32K;
  156.     
  157.     srand( (unsigned int)clock() );
  158.     for( k=fr.lupy; k<fr.rdwy; k+=size )
  159.     {
  160.         y = k ;
  161.         ys= size;
  162.         if( (dy=(y + ys - fr.rdwy)) > 0 )    ys -= dy;
  163.         
  164.         for( j=fr.lupx; j<fr.rdwx; j+=(size>>1) )
  165.         {
  166.             MOS_rdpos( &ch, &mx, &my );
  167.             if( ch & MOS_RIGHT )
  168.                 break;
  169.             
  170.             x = j ;
  171.             xs= size;
  172.             if( (dx=(x + xs - fr.rdwx)) > 0 )    xs -= dx;
  173.             
  174.             for( i=0; i<val ; i++ )
  175.             {
  176.                 x1 = x + (rand() % (xs+1));
  177.                 x2 = x + (rand() % (xs  ));
  178.                 y1 = y + (rand() % (ys+1));
  179.                 y2 = y + (rand() % (ys  ));
  180.                 
  181.                 chgFunc( x1,y1,x2,y2 ,mode);
  182.                 
  183.             }
  184.         }
  185.     }
  186.     
  187.     do
  188.     {    MOS_rdpos( &ch, &mx, &my );
  189.     }while( ch & MOS_RIGHT );
  190.     
  191.     
  192. #ifdef DEBUG
  193.     printf("clock = %d", clock()-t );
  194. #endif
  195.     
  196.     memcpy( ret_fr, &fr, sizeof(fr) );
  197.     
  198.     return NOERR;
  199. }
  200.  
  201. /*
  202.     速度比較
  203.     
  204.     val=4,size=8
  205.     
  206.         EGB_point    使用しない    !EGB_pset        マスク        マクロ使用
  207.     
  208.     16        980            785            232            272            257/269
  209.     256        965            758            204            249            230/245
  210.     32k        653            530            130            161            151/160
  211.     
  212.     互換モード
  213.     530/602
  214.     
  215. */
  216.